/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#include "../import/head.h"
#include "../macro/head.h"
#include "../xos/head.h"
#include "hook.h"
#include "mgr.h"

namespace xos_container
{
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    static mgr * mgr_ptr = 0;

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    mgr::mgr()
    {}

    mgr::~mgr()
    {}

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    int mgr::static_init( i_container ** ppv )
    {
        xos_container::i_container* pContainer1 = 0;
        xos_container::i_container* pContainer2 = 0;
        return xos_stl::static_init_module( pContainer1, ppv, pContainer2, mgr_ptr );
    }

    i_container* mgr::container()
    {
        return mgr_ptr;
    }
    
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    // str append
    int mgr::str_append( char* lpszStr, int nBufSize, const char* lpszAdder, const char seperator )
    {
        int ret = 0;

        const char* lpszSecond = lpszAdder;
        char* lpszFirst = lpszStr;
        char last_char = 0;
        int nLen = 0;

        if( ( 0 == ret ) && ( !lpszFirst || !lpszSecond || (0 == *lpszSecond) ) )
        {
            ret = 1;
        }

        // get lpszFirst len
        if( 0 == ret )
        {
            while( (0 != lpszFirst[nLen]) && (nLen < nBufSize) )
            {
                nLen++;
            }
            // lpszFirst not end with 0 within nBufSize
            if( nLen == nBufSize )
            {
                return 2;
            }
        }
        // test and add & remove seperator
        if( 0 == ret )
        {
            bool bFirstHas = (lpszFirst[nLen-1] == seperator);
            bool bLastHas = (lpszSecond[0] == seperator);
            if( !bFirstHas && !bLastHas )
            {
                lpszFirst[nLen + 0] = seperator;
                lpszFirst[nLen + 1] = 0;
                nLen += 1;
            }
            else if( bFirstHas && bLastHas )
            {
                nLen -= 1;
                last_char = lpszFirst[nLen];
                lpszFirst[nLen] = 0;
            }
        }
        // strcat， 如果lpszAdder太长，恢复lpszUrl的原样
        if( 0 == ret )
        {
            int nPos = 0;
            while( ( 0 != lpszSecond[nPos]) && (nPos + nLen < nBufSize) )
            {
                lpszFirst[nPos+nLen] = lpszSecond[nPos];
                nPos++;
            }
            // lpszAdder太长，恢复lpszStr的原样
            if( nPos+nLen == nBufSize )
            {
                if( 0 != last_char )
                {
                    lpszFirst[nLen] = last_char;
                    nLen++;
                }
                lpszFirst[nLen] = 0;
                ret = 3;
            }
            else
            {
                lpszFirst[nPos+nLen] = 0;
            }
        }

        return ret;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 
    // return obj
    // 
    xos_aio::i_aio_mgr * mgr::aio()
    {
        return aio::get();
    }

    xos_common::i_common * mgr::common()
    {
        return common::get();
    }

    xos_config::i_config * mgr::config()
    {
        return config::get();
    }

    xos_compress::i_compress_mgr * mgr::compress()
    {
        return compress::get();
    }

    xos::i_xos * mgr::xos()
    {
        return core::get();
    }

    xos_curl::i_curl_mgr * mgr::curl()
    {
        return curl::get();
    }

    xos_encrypt::i_encrypt_mgr * mgr::encrypt()
    {
        return encrypt::get();
    }

    xos_http_protocol::i_http_mgr * mgr::http()
    {
        return http_protocol::get();
    }

    xos_json::i_json_mgr * mgr::json()
    {
        return json::get();
    }

    xos_log::i_log_mgr * mgr::log()
    {
        return log::get();
    }

    xos_net::i_net * mgr::net()
    {
        return net::get();
    }

    xos_box::i_box_mgr * mgr::box()
    {
        return box::get();
    }

    xos_odbc::i_odbc_mgr * mgr::odbc()
    {
        return odbc::get();
    }

    xos_package::i_package_mgr * mgr::package()
    {
        return package::get();
    }

    xos_sqlite::i_sqlite_mgr * mgr::sqlite()
    {
        return sqlite::get();
    }

    xos_xml::i_xml_mgr * mgr::xml()
    {
        return xml::get();
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    // 常用对象，不需要释放
    xos_common::i_misc * mgr::common_misc()
    {
        return common()->misc();
    }

    xos_log::i_log_file * mgr::log_file()
    {
        return log::log_file();
    }

    xos::i_misc * mgr::misc()
    {
        return xos()->misc();
    }

    xos::i_crt * mgr::crt()
    {
        return xos()->crt();
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    int mgr::put_back_to_pool()
    {
        int ret = 0;
        delete this;
        return ret;
    }

    int mgr::init()
    {
        int ret = 0;
        if( 0 == ret )
        {
            ret = hook::init();
        }
        return ret;
    }

    int mgr::term()
    {
        int ret = 0;
        hook::term();
        return ret;
    }

} // xos_container
